package fa7.socialcode.dao.hibernate;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import fa7.socialcode.dao.CategoriaDao;
import fa7.socialcode.model.Categoria;

@Repository(value = "categoriaDao")
public class CategoriaDaoHibernate implements CategoriaDao {
	HibernateTemplate hibernateTemplate;
	// Somente para log
	Log logger = LogFactory.getLog(CategoriaDaoHibernate.class);

	@Autowired
	public CategoriaDaoHibernate(SessionFactory sessionFactory) {
		this.hibernateTemplate = new HibernateTemplate(sessionFactory);
	}

	@Override
	public Categoria findCategoria(Long categoriaId) {
		Categoria categoria = (Categoria) hibernateTemplate.get(
				Categoria.class, categoriaId);
		if (categoria == null) {
			throw new ObjectRetrievalFailureException(Categoria.class,
					categoriaId);
		}
		return categoria;
	}

	@Override
	public List findCategorias() {
		return hibernateTemplate.find("from Categoria");
	}

	@Override
	public void removeCategoria(Long categoriaId) {
		hibernateTemplate.delete(findCategoria(categoriaId));
	}

	@Override
	public void removeCategoria(Categoria categoria) {
		hibernateTemplate.delete(categoria);
	}

	@Override
	public void saveCategoria(Categoria categoria) {
		hibernateTemplate.saveOrUpdate(categoria);

		if (logger.isDebugEnabled()) {
			logger.debug("categoriaId set to: " + categoria.getId());
		}
	}
}
